home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / dev / misc / dialoglib.lha / root.c < prev    next >
C/C++ Source or Header  |  1993-03-06  |  5KB  |  185 lines

  1. #include <libraries/gadtools.h>
  2. #include <proto/gadtools.h>
  3. #include <proto/utility.h>
  4. #include "dialog.h"
  5. #ifdef DEBUG1
  6.     #include <stdio.h>
  7. #endif
  8.  
  9. static VOID setupRoot( DialogElement *de )
  10. {
  11.     DialogElement *member;
  12.     LONG xspace, yspace, minwidth = 0, minheight = 0, maxwidth = 0, maxheight = 0;
  13.  
  14.     if( !de )
  15.         return;
  16.  
  17.     if( member = (DialogElement *)GetTagData( DA_Member, 0, de->taglist ) )
  18.     {
  19.         de->structure = getDialogElementStructure( member );
  20.         xspace = GetTagData( DA_XSpacing, INTERWIDTH, de->taglist );
  21.         yspace = GetTagData( DA_YSpacing, INTERHEIGHT, de->taglist );
  22.         setupDialogElement( member );
  23.         de->idcmp_mask |= member->idcmp_mask;
  24.         if( de->structure & DESF_HBaseline )
  25.         {
  26.             minheight = getMinTopExtent( member ) + getMinBottomExtent( member ) + 2 * yspace;
  27.             maxheight = getMaxTopExtent( member ) + getMaxBottomExtent( member ) + 2 * yspace;
  28.         }
  29.         else
  30.         {
  31.             minheight = getMinHeight( member ) + 2 * yspace;
  32.             maxheight = getMaxHeight( member ) + 2 * yspace;
  33.         }
  34.         if( de->structure & DESF_VBaseline )
  35.         {
  36.             minwidth = getMinLeftExtent( member ) + getMinRightExtent( member ) + 2 * xspace;
  37.             maxwidth = getMaxLeftExtent( member ) + getMaxRightExtent( member ) + 2 * xspace;
  38.         }
  39.         else
  40.         {
  41.             minwidth = getMinWidth( member ) + 2 * xspace;
  42.             maxwidth = getMaxWidth( member ) + 2 * xspace;
  43.         }
  44.     }
  45.     setMinWidth( de, minwidth );
  46.     setMaxWidth( de, maxwidth );
  47.     setMinHeight( de, minheight );
  48.     setMaxHeight( de, maxheight );
  49. }
  50.  
  51. static ULONG layoutRoot( DialogElement *de, LayoutMessage *lm )
  52. {
  53.     DialogElement *member;
  54.     LayoutMessage message;
  55.     ULONG error = DIALOGERR_OK;
  56.     LONG x, y, xspace, yspace;
  57.  
  58.     if( !de )
  59.         return DIALOGERR_BAD_ARGS;
  60.     if( !lm )
  61.         return DIALOGERR_BAD_ARGS;
  62.  
  63. #ifdef DEBUG1
  64.     printf( "layoutRoot : "
  65.         "x %d, y %d, width %d, height %d, left %d, right %d, top %d, bottom %d\n",
  66.         lm->lm_X, lm->lm_Y, lm->lm_Width, lm->lm_Height,
  67.         lm->lm_Left, lm->lm_Right, lm->lm_Top, lm->lm_Bottom );
  68. #endif
  69.     if( member = (DialogElement *)GetTagData( DA_Member, 0, de->taglist ) )
  70.     {
  71.         xspace = GetTagData( DA_XSpacing, INTERWIDTH, de->taglist );
  72.         yspace = GetTagData( DA_YSpacing, INTERHEIGHT, de->taglist );
  73.         x = lm->lm_X + xspace;
  74.         y = lm->lm_Y + yspace;
  75.         if( de->structure & DESF_HBaseline )
  76.         {
  77.             LONG mintop, minbottom, top, bottom, white, spare;
  78.  
  79.             mintop = getMinTopExtent( member );
  80.             minbottom = getMinBottomExtent( member );
  81.             white = lm->lm_Height - 2 * yspace - mintop - minbottom;
  82.             top = getMaxTopExtent( member ) - mintop;
  83.             bottom = getMaxBottomExtent( member ) - minbottom;
  84.             spare = top + bottom;
  85.             top = mintop + ( ( spare ) ? ( top * white ) / spare : 0 );
  86.             bottom = minbottom + ( ( spare ) ? ( bottom * white ) / spare : 0 );
  87.             prepareLayoutHBaseline( &message, top, bottom );
  88.             y += top;
  89.         }
  90.         else
  91.             prepareLayoutNoHBaseline( &message, lm->lm_Height - 2 * yspace );
  92.         if( de->structure & DESF_VBaseline )
  93.         {
  94.             LONG minleft, minright, left, right, white, spare;
  95.  
  96.             minleft = getMinLeftExtent( member );
  97.             minright = getMinRightExtent( member );
  98.             white = lm->lm_Width - 2 * xspace - minleft - minright;
  99.             left = getMaxLeftExtent( member ) - minleft;
  100.             right = getMaxRightExtent( member ) - minright;
  101.             spare = left + right;
  102.             left = minleft + ( ( spare ) ? ( left * white ) / spare : 0 );
  103.             right = minright + ( ( spare ) ? ( right * white ) / spare : 0 );
  104.             prepareLayoutVBaseline( &message, left, right );
  105.             x += left;
  106.         }
  107.         else
  108.             prepareLayoutNoVBaseline( &message, lm->lm_Width - 2 * xspace );
  109.         prepareLayoutX( &message, x );
  110.         prepareLayoutY( &message, y );
  111.         error = layoutDialogElement( member, &message, lm->lm_PreviousPtr );
  112.     }
  113.     return error;
  114. }
  115.  
  116. static DialogElement *matchRoot( DialogElement *de, MatchMessage *mm )
  117. {
  118.     struct IntuiMessage *imsg;
  119.     DialogElement *member, *match = NULL;
  120.  
  121.     if( !de )
  122.         return NULL;
  123.     if( !mm )
  124.         return NULL;
  125.  
  126.     imsg = mm->mm_IntuiMsg;
  127.  
  128.     if( imsg->Class & IDCMP_REFRESHWINDOW )
  129.         GT_BeginRefresh( imsg->IDCMPWindow );
  130.  
  131.     if( member = (DialogElement *)GetTagData( DA_Member, 0, de->taglist ) )
  132.         match = mapDialogEvent( member, mm->mm_IntuiMsg );
  133.  
  134.     if( imsg->Class & IDCMP_REFRESHWINDOW )
  135.         GT_EndRefresh( imsg->IDCMPWindow, TRUE );
  136.  
  137.     return match;
  138. }
  139.  
  140. static VOID clearRoot( DialogElement *de, DialogMessage *dm )
  141. {
  142.     DialogElement *member;
  143.  
  144.     if( !de )
  145.         return;
  146.  
  147.     if( member = (DialogElement *)GetTagData( DA_Member, 0, de->taglist ) )
  148.         clearDialogElement( member );
  149. }
  150.  
  151. /****** dialog.lib/dispatchRoot ******
  152. *
  153. *    NAME
  154. *        dispatchRoot -- dispatches messages for root class dialog elements
  155. *
  156. *    SEE ALSO
  157. *        --background--
  158. *
  159. **************************************/
  160.  
  161. ULONG dispatchRoot( struct Hook *hook, DialogElement *de, DialogMessage *dm )
  162. {
  163.     ULONG result;
  164.  
  165.     switch( dm->dm_MethodID )
  166.     {
  167.     case DIALOGM_GETSTRUCT:
  168.         result = 0;
  169.         break;
  170.     case DIALOGM_SETUP:
  171.         setupRoot( de );
  172.         break;
  173.     case DIALOGM_LAYOUT:
  174.         result = layoutRoot( de, (LayoutMessage *)dm );
  175.         break;
  176.     case DIALOGM_MATCH:
  177.         result = (ULONG)matchRoot( de, (MatchMessage *)dm );
  178.         break;
  179.     case DIALOGM_CLEAR:
  180.         clearRoot( de, dm );
  181.         break;
  182.     }
  183.     return result;
  184. }
  185.